package ma.fizazi.missionsmanagement.business.utilisateurs.impl;

import java.util.ArrayList;
import java.util.List;

import ma.fizazi.missionsmanagement.business.utilisateurs.UtilisateurBusiness;
import ma.fizazi.missionsmanagement.dao.commons.DAOServices;
import ma.fizazi.missionsmanagement.model.ProfilType;
import ma.fizazi.missionsmanagement.model.Utilisateur;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

@Service("utilisateurBusiness")
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
public class UtilisateurBusinessImpl implements UtilisateurBusiness {

	@Autowired
	DAOServices daoServices;

	@Transactional(propagation = Propagation.REQUIRED, readOnly = false)
	public void saveUtilisateur(Utilisateur utilisateur) {
		daoServices.saveEntity(utilisateur);
	}

	public Utilisateur getUtilisateurById(int id) {
		return (Utilisateur) daoServices.getEntityById2(Utilisateur.class,
				new Integer(id));
	}

	public List<Utilisateur> getAllUtilisateurs() {
		List<Utilisateur> utilisateurs = null;
		utilisateurs = (List<Utilisateur>) daoServices
				.getEntities(Utilisateur.class);
		return utilisateurs;
	}

	public List<Utilisateur> getActiveUtilisateurs() {
		List<Utilisateur> allUsers = new ArrayList<Utilisateur>();
		List<Utilisateur> activeUsers = new ArrayList<Utilisateur>();
		allUsers = (List<Utilisateur>) daoServices
				.getEntities(Utilisateur.class);
		if (allUsers != null) {
			for (Utilisateur utilisateur : allUsers) {
				if (utilisateur.isActive()) {
					activeUsers.add(utilisateur);
				}
			}
		}
		return activeUsers;
	}

	public List<Utilisateur> getAllConsultants() {
		List<Utilisateur> allUsers = new ArrayList<Utilisateur>();
		List<Utilisateur> allConsultants = new ArrayList<Utilisateur>();
		allUsers = (List<Utilisateur>) daoServices
				.getEntities(Utilisateur.class);
		if (allUsers != null) {
			for (Utilisateur utilisateur : allUsers) {
				if (utilisateur.getProfil().getNum() == ProfilType.Collaborateur
						.ordinal()) {
					allConsultants.add(utilisateur);
				}
			}
		}
		return allConsultants;
	}

	public List<Utilisateur> getActiveConsultants() {
		List<Utilisateur> allConsultants = new ArrayList<Utilisateur>();
		List<Utilisateur> activeConsultants = new ArrayList<Utilisateur>();
		allConsultants = getAllConsultants();
		if (allConsultants != null) {
			for (Utilisateur utilisateur : allConsultants) {
				if (utilisateur.isActive()) {
					activeConsultants.add(utilisateur);
				}
			}
		}
		return activeConsultants;
	}


	public List<Utilisateur> getAllDirecteurs() {
		List<Utilisateur> allUsers = new ArrayList<Utilisateur>();
		List<Utilisateur> allDirecteurs = new ArrayList<Utilisateur>();
		allUsers = (List<Utilisateur>) daoServices
				.getEntities(Utilisateur.class);
		if (allUsers != null) {
			for (Utilisateur utilisateur : allUsers) {
				if (utilisateur.getProfil().getNum() == ProfilType.Administrateur
						.ordinal()) {
					allDirecteurs.add(utilisateur);
				}
			}
		}
		return allDirecteurs;
	}

	public List<Utilisateur> getActiveDirecteurs() {
		List<Utilisateur> allDirecteurs = new ArrayList<Utilisateur>();
		List<Utilisateur> activeDirecteurs = new ArrayList<Utilisateur>();
		allDirecteurs = getAllDirecteurs();
		if (allDirecteurs != null) {
			for (Utilisateur utilisateur : allDirecteurs) {
				if (utilisateur.isActive()) {
					activeDirecteurs.add(utilisateur);
				}
			}
		}
		return activeDirecteurs;
	}

	@Transactional(propagation = Propagation.REQUIRED, readOnly = false)
	public void disableUtilisateur(int id) {
		Utilisateur user = (Utilisateur) daoServices.getEntityById2(
				Utilisateur.class, id);
		user.setActive(false);
		daoServices.updateEntity(user);

	}

	public Utilisateur getUserByMaticule(String matricule) {
		return (Utilisateur) daoServices.getUniqueEntitiyByProperty(
				Utilisateur.class, "matricule", matricule);
	}

}